﻿#pragma once

#include "../graphic/BaseGraphicView.h"

#include <boost/signal.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Network.hpp>
#include "../graphic/DeductionView.h"
#include "../../../utils/gui/Form.h"
#include "../../../domain/models/CardSet.h"
#include "../../../domain/models/Player.h"
#include "../../../domain/network/GameServer.h"

namespace Views {
	namespace Server {
		class DeductionView: public Graphic::DeductionView
		{
			Domain::Network::GameServer* server; /**< Serwer gry */
			Players::Player* server_owner; /**< Gracz będący założycielem serwera */
			Players::Player* current_player; /**< Gracz, którego jest teraz tura */
			Players::Player* asked_player; /**< Gracz pytany o to, którą kartę chce pokazać */
			Cards::CardsCollection cards; /**< Wszystkie karty w grze */
			Utils::GUI::Control* CardInfo; /**< Kontrolka z informacją o pokazaniu karty */

		public:
			/**
			* @param form Główna formatka aplikacji
			* @param server Serwer gry
			* @param server_owner Gracz będący założycielem serwera
			* @param cards Karty w grze
			*/
			DeductionView(Utils::GUI::Form*, Domain::Network::GameServer*, Players::Player*, Cards::CardsCollection);

			/**
			* Jeśli aktualny gracz jest właścicielem serwera, otwiera okno dialogowe z wyborem kart
			* W przeciwnym razie czeka na wiadomość od klienta którego teraz jest tura
			*/
			virtual void openPickSearchedCardsDialog(Players::Player*, Cards::PlayersCards, Cards::WeaponsCards);
			/**
			* Jeśli aktualny gracz jest właścicielem serwera, otwiera okno dialogowe z wyborem karty
			* W przeciwnym razie czeka na wiadomość od klienta którego teraz jest tura
			*/
			virtual void openPickCardDialog(Players::Player*, Cards::CardSet&);

			/**
			* Jeśli aktualny gracz jest właścicielem serwera, otwiera okno dialogowe z informacją o znalezionej karcie
			* W przeciwnym razie czeka na wiadomość od klienta którego teraz jest tura o zamknięciu takiego okna
			* i pokazuje użytkownikowi wyłącznie okrojoną informację, który gracz miał jedną z 3 kart.
			*/
			virtual void showDeductedCard(Cards::Card* card, Players::Player* current_player, Players::Player* card_owner);
			/**
			* Jeśli aktualny gracz jest właścicielem serwera, otwiera okno dialogowe z informacją o braku znalezionych karcie
			* W przeciwnym razie czeka na wiadomość od klienta którego teraz jest tura o zamknięciu takiego okna
			*/
			virtual void showNoCardsDeducted(Cards::CardSet& cards, Players::Player* player);
		protected:
			/**
			* Rozsyła do pozostałych 
			*/
			virtual void onSearchedCardsPick(Domain::Network::PlayerClient* player_client, sf::Packet packet);
			virtual void onSearchedCardsPick(Cards::PlayerCard*, Cards::WeaponCard*);
			virtual void onDeductedCardPick(Domain::Network::PlayerClient* player_client, sf::Packet packet);
			virtual void onDeductedCardPick(Cards::Card*);

			virtual void onDeductedCardsDialogClose();
			virtual void onDeductedCardsDialogClose(Domain::Network::PlayerClient* player_client, sf::Packet packet);
		};
	}
}

